JavaScript์์ var, let, const์ ์ฐจ์ด๋ ๋จ์ํ ๋ฌธ๋ฒ์ ์ฐจ์ด๊ฐ ์๋๋ค. ์ค์ ์ฐจ์ด๋ JavaScript ์์ง์ด ๋ณ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์, ์ฆ Execution Context ์์ฑ ๊ณผ์ ์์ ๋ฐ์ํ๋ค.
์ด๋ฒ ๊ธ์์๋ Execution Context ๊ด์ ์์ ๋ณ์ ์ ์ธ ๋ฐฉ์์ ์ฐจ์ด๋ฅผ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค.
๐ก Execution Context์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋ ๊น?
JavaScript๋ ์ฝ๋๋ฅผ ์์์ ์๋๋ก ๋ฐ๋ก ์คํํ์ง ์๋๋ค. ๋จผ์ Execution Context(์คํ ์ปจํ ์คํธ)๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์์์ ์ฝ๋๋ฅผ ์คํํ๋ค.
Execution Context๋ ๋ ๋จ๊ณ๋ก ๋์ํ๋ค.
1. Creation Phase (์์ฑ ๋จ๊ณ)
์ฝ๋๋ฅผ ์คํํ๊ธฐ ์ ์ ์์ง์ด ๋จผ์ ์ํํ๋ ๋จ๊ณ์ด๋ค.
- ๋ณ์ ์ ์ธ ๋ฑ๋ก
- ํจ์ ์ ์ธ ๋ฑ๋ก
- this ๊ฒฐ์
์ด ๊ณผ์ ์์ ๋ณ์์ ๋ฑ๋ก ๋ฐฉ์๊ณผ ์ด๊ธฐํ ๋ฐฉ์์ด var, let, const ๋ง๋ค ๋ฌ๋ผ์ง๋ค.
2. Execution Phase (์คํ ๋จ๊ณ)
์ด์ ์ฝ๋๊ฐ ํ ์ค์ฉ ์คํ๋๋ค.
- ๋ณ์ ๊ฐ ํ ๋น
- ํจ์ ํธ์ถ
var / let / const์ ์ฐจ์ด๋ Creation Phase์์ ๋ณ์์ ์ด๊ธฐํ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค.
๐ญ var์ ๋์ ๋ฐฉ์
console.log(a);
var a = 10;
1. Creation Phase
์์ง์ var a๋ฅผ ๋ฐ๊ฒฌํ๋ฉด ๋ณ์๋ฅผ ๋ฑ๋กํ๊ณ ๋์์ undefined๋ก ์ด๊ธฐํ๋ฅผ ํ๋ค.
// ๋ฉ๋ชจ๋ฆฌ ์ํ
a: undefined
์ฆ, var๋ ์ ์ธ๊ณผ ์ด๊ธฐํ๊ฐ ๋์์ ์ด๋ฃจ์ด์ง๋ค.
2. Execution Phase
console.log(a); // undefined
์ด๋ฏธ a๊ฐ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ์๋๋ผ undefined๊ฐ ์ถ๋ ฅ๋๋ค.
์ด ํ์์ด ๋ฐ๋ก ์ฐ๋ฆฌ๊ฐ ๋งํ๋ Hoisting์ฒ๋ผ ๋ณด์ด๋ ํ์์ด๋ค.
๐ญ let / const์ ๋์ ๋ฐฉ์
console.log(a);
let a = 10;
1. Creation Phase
์์ง์ ๋ณ์๋ฅผ ๋ฑ๋กํ์ง๋ง ์ด๊ธฐํ ์ํค์ง ์๋๋ค.
// ๋ฉ๋ชจ๋ฆฌ ์ํ
a: <uninitialized>
๋ณ์๋ ์กด์ฌํ์ง๋ง ์์ง ์ฌ์ฉํ ์ ์๋ ์ํ๊ฐ ๋๋ค.
2. Execution Phase
console.log(a); // ReferenceError
์ด๊ธฐํ๋์ง ์์ ๋ณ์์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์ด ๊ตฌ๊ฐ์ TDZ (Temporal Dead Zone) ๋ผ๊ณ ํ๋ค.
๐ก TDZ (Temporal Dead Zone)๋?
๋ณ์๊ฐ ์ ์ธ๋์์ง๋ง ์์ง ์ด๊ธฐํ๋์ง ์์ ์ ๊ทผํ ์ ์๋ ๊ตฌ๊ฐ
์ฌ๊ธฐ์ ์ค์ํ ์ !
- TDZ๋ ๋ณ์๊ฐ ์๋ ๊ตฌ๊ฐ์ด ์๋๋ค.
- ๋ณ์๋ ์กด์ฌํ์ง๋ง ์ ๊ทผ์ด ๊ธ์ง๋ ๊ตฌ๊ฐ์ด๋ค.
TDZ๋ ๋ณ์ ์ ์ธ์ด ์์๋๋ ์์ ๋ถํฐ ์ค์ ์ด๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง๋ ์์ ๊น์ง ์ ์ง๋๋ค.
๐ ์ TDZ๊ฐ ์๊ฒผ์๊น?
var์๋ ์ค๋๋ ์ค๊ณ ๋ฌธ์ ๊ฐ ์์๋ค.
1. ๋ธ๋ก ์ค์ฝํ๋ฅผ ๋ฌด์ํ๋ค
if (true) {
var a = 10;
}
console.log(a); // 10
๋ธ๋ก ๋ด๋ถ ๋ณ์์ธ๋ฐ ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค.
2. ์ ์ธ ์ ์ ์ฌ์ฉํด๋ ์๋ฌ๊ฐ ์๋ค
console.log(a); // undefined
var a = 10;
๋ฒ๊ทธ๊ฐ ๋ฐ์ํด๋ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต๋ค.
๊ทธ๋์ ES6์์๋ ๋ค์ ๋ชฉํ๋ก let๊ณผ const๊ฐ ๋์ ๋์๋ค :
- ๋ธ๋ก ์ค์ฝํ ์ ๊ณต
- ์ ์ธ ์ ์ ๊ทผ ๋ฐฉ์ง
- ์์ธก ๊ฐ๋ฅํ ์ฝ๋ ์์ฑ
- ๋ฐํ์ ๋ฒ๊ทธ ๊ฐ์
TDZ๋ ์ด๋ฌํ ์ค์๋ฅผ ๊ฐํ๊ฒ ๋ง๊ธฐ ์ํ ์ค๊ณ๋ผ๊ณ ๋ณผ ์ ์๋ค.
๐ const๋ ์ ๋ด๋ถ ๊ฐ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๊น?
const obj = { a: 1 };
obj.a = 2; // ๊ฐ๋ฅ
const๋ ๊ฐ์ ๊ณ ์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ณ์ ๋ฐ์ธ๋ฉ(binding)์ ๊ณ ์ ํ๋ค. ์ฆ, ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ฌํ ๋นํ๋๊ฒ ์๋๋ผ ๋ด๋ถ ์์ฑ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๋ค.
obj = {}; // โ ์ฌํ ๋น ๋ถ๊ฐ
JavaScript๋ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ(reference)๋ก ๋ค๋ฃจ๊ธฐ ๋๋ฌธ์ด๋ค.
๐งถ ํต์ฌ ์ ๋ฆฌ
| ๊ตฌ๋ถ | var | let | const |
|---|---|---|---|
| ์ค์ฝํ | ํจ์ ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ | ๋ธ๋ก ์ค์ฝํ |
| ์ฌ์ ์ธ | ๊ฐ๋ฅ | ๋ถ๊ฐ | ๋ถ๊ฐ |
| ์ฌํ ๋น | ๊ฐ๋ฅ | ๊ฐ๋ฅ | ๋ถ๊ฐ |
| Hoisting | undefined ์ด๊ธฐํ | TDZ | TDZ |
| ์ด๊ธฐํ ์์ | Creation Phase | Execution Phase | Execution Phase |
๊ฒฐ๊ตญ var, let, const์ ์ฐจ์ด๋ Hoisting์ด ๋๋๋ ์ ๋๋๋์ ๋ฌธ์ ๊ฐ ์๋๋ค. ๋ชจ๋ ์ ์ธ์ Hoisting ๋๋ค.
์ง์ง ์ฐจ์ด๋:
Execution Context์ Creation Phase์์ ๋ณ์๊ฐ ์ด๋ป๊ฒ ์ด๊ธฐํ๋๋๊ฐ์ ์ฐจ์ด๋ค.
var: ์ ์ธ + ์ด๊ธฐํ ๋์์ ์งํlet/const: ์ ์ธ๋ง ๋จผ์ ์งํ โ TDZ ๋ฐ์
